package com.bocloud.cmp.interfaces.app.resource;

import java.util.List;
import java.util.Map;

import com.bocloud.cmp.entity.app.resource.Application;
import com.bocloud.common.model.BsmResult;
import com.bocloud.common.model.Param;
import com.bocloud.common.model.RequestUser;

/**
 * 应用service接口
 * 
 * @author zjm
 * @date 2017年3月17日
 * @describe
 */
public interface ApplicationService {

	/**
	 * 列表查询
	 * 
	 * @author zjm
	 * @date 2017年3月17日
	 * 
	 * @param page
	 * @param rows
	 * @param params
	 * @param sorter
	 * @param simple
	 * @return
	 */
	public BsmResult list(int page, int rows, List<Param> params, Map<String, String> sorter, Boolean simple,
			RequestUser requestUser);

	/**
	 * 根据编排文件查询应用
	 * 
	 * @author zjm
	 * @date 2017年4月26日
	 *
	 * @param page
	 * @param rows
	 * @param params
	 * @param sorter
	 * @param simple
	 * @return
	 */
	public BsmResult listByLayout(int page, int rows, List<Param> params, Map<String, String> sorter, Boolean simple,
			RequestUser requestUser);

	/**
	 * 添加应用信息
	 * 
	 * @author zjm
	 * @date 2017年3月17日
	 * 
	 * @param user
	 * @param application
	 * @return
	 */
	public BsmResult create(RequestUser user, Application application);

	/**
	 * 获取应用详情
	 * 
	 * @author zjm
	 * @date 2017年3月17日
	 * 
	 * @param id
	 * @return
	 */
	public BsmResult detail(Long id, RequestUser user);

	/**
	 * 删除应用信息
	 * 
	 * @author zjm
	 * @date 2017年3月17日
	 * 
	 * @param ids
	 * @param userId
	 * @return
	 */
	public BsmResult remove(List<Long> ids, Long userId);

	/**
	 * 修改应用信息
	 * 
	 * @author zjm
	 * @date 2017年3月17日
	 * 
	 * @param application
	 * @param userId
	 * @return
	 */
	public BsmResult modify(Application application, Long userId);

	/**
	 * 按照资源文件部署应用
	 * 
	 * @author zjm
	 * @date 2017年3月23日
	 *
	 * @param appId
	 * @param layoutId
	 * @param clusterId
	 * @param user
	 * @return
	 */
	public BsmResult layoutDeploy(Long appId, Long layoutId, Long clusterId, RequestUser user);

	/**
	 * 按照资源文件删除应用
	 * 
	 * @author zjm
	 * @date 2017年3月23日
	 *
	 * @param filePath
	 * @return
	 */
	public BsmResult deleteLayoutDeploy(Long appId, Long layoutId, RequestUser user);

	/**
	 * 变更rc实例数
	 * 
	 * @author zjm
	 * @date 2017年3月23日
	 *
	 * @param name
	 * @param count
	 * @return
	 */
	public BsmResult scaleRc(Long appId, String namespace, String name, int count, RequestUser user);

	// TODO 暂不支持Deployment资源的管理，请不要删除
	// /**
	// * 获取deployment的集合
	// *
	// * @author zjm
	// * @date 2017年3月23日
	// *
	// * @param appId
	// * @return
	// */
	// public BsmResult getDeployments(Long appId);

	/**
	 * 获取service的集合
	 * 
	 * @author zjm
	 * @date 2017年3月23日
	 *
	 * @param appId
	 * @return
	 */
	public BsmResult getServices(Long appId);

	/**
	 * 获取pod状态
	 * 
	 * @author zjm
	 * @date 2017年3月23日
	 *
	 * @param name
	 * @return
	 */
	public BsmResult getPodStatus(Long appId, String namespace, String name, RequestUser user);

	/**
	 * 滚动升级/回滚 如果softwareId不为空则是按照镜像滚动升级 如果为空则按照资源名称查询部署历史，回滚到上一个版本
	 * 
	 * @author zjm
	 * @date 2017年4月4日
	 *
	 * @param resourceName
	 * @param appId
	 * @param softwareId
	 * @param user
	 * @return
	 */
	public BsmResult rolling(String namespace, String resourceName, Long appId, Long softwareId, RequestUser user);

	/**
	 * rc弹性伸缩（目前只支持cpu）
	 * 
	 * @author zjm
	 * @date 2017年3月28日
	 *
	 * @param appId
	 * @param resourceName
	 *            资源名称
	 * @param requestValue
	 *            资源请求，设置期望资源量（必填项，"200" 默认单位：m）
	 * @param minReplicas
	 *            最小实例数
	 * @param maxReplicas
	 *            最大实例数
	 * @param cpuTargetUtilization
	 *            cpu利用率
	 * @return
	 */
	public BsmResult autoScale(Long appId, String namespace, String resourceName, String requestValue, int minReplicas,
			int maxReplicas, int cpuTargetUtilization, RequestUser user);

	/**
	 * 编辑rc资源
	 * 
	 * @author zjm
	 * @date 2017年3月31日
	 *
	 * @param rcName
	 * @param limits
	 *            资源限制，设置期望资源量（必填项，比如Map<"cpu", "200"> 默认单位：m）；
	 *            可以不设置，如果设置值必须大于或等于request
	 * @param requests
	 *            资源请求，设置期望资源量（必填项，比如Map<"cpu", "200"> 默认单位：m）
	 * @return
	 */
	public BsmResult editRcResource(Long appId, String namespace, String rcName, Map<String, String> limits,
			Map<String, String> requests, RequestUser user);

	/**
	 * 获取Pod的资源
	 * 
	 * @author zjm
	 * @date 2017年4月13日
	 *
	 * @param appId
	 * @param namespace
	 * @param resourceName
	 * @param resourceType
	 * @return
	 */
	public BsmResult getPodResource(Long appId, String namespace, String resourceName, String resourceType,
			RequestUser user);

	/**
	 * 获取hpa资源
	 * 
	 * @author zjm
	 * @date 2017年4月19日
	 *
	 * @param appId
	 * @param namespace
	 * @param resourceName
	 * @param resourceKind
	 * @return
	 */
	public BsmResult getHPA(Long appId, String namespace, String resourceName, String resourceKind, RequestUser user);

	/**
	 * 按照资源名称和类型删除资源
	 * 
	 * @author zjm
	 * @date 2017年4月1日
	 *
	 * @param resourceName
	 * @param resourceType
	 * @return
	 */
	public BsmResult deleteResource(Long appId, String namespace, String resourceName, String resourceType,
			RequestUser user);

	/**
	 * 按照应用id查询该应用所有的pod
	 * 
	 * @author zjm
	 * @date 2017年4月5日
	 *
	 * @param appId
	 * @return
	 */
	public BsmResult getPodsByAppId(Long appId);

	/**
	 * 获取资源实例数
	 * 
	 * @author zjm
	 * @date 2017年4月7日
	 *
	 * @param resourceName
	 * @param resourceType
	 * @return
	 */
	public BsmResult getReplicas(Long appId, String namespace, String resourceName, String resourceType, RequestUser user);

	/**
	 * 按照应用ID获取集群路径
	 * 
	 * @author zjm
	 * @date 2017年4月8日
	 *
	 * @param appId
	 * @return
	 */
	public BsmResult getClusterProXyUrl(Long appId);

	/**
	 * 获取应用的label
	 * 
	 * @param appId
	 * @param bsmResult
	 * @return
	 */
	public Map<String, String> getAppLabels(Long appId, BsmResult bsmResult);
	
	/**
	 * 江苏银行特殊需求：重建服务
	 * 
	 * @author zjm
	 * @date 2017年4月4日
	 *
	 * @param resourceName
	 * @param appId
	 * @param softwareId
	 * @param user
	 * @return
	 */
	public BsmResult rebuildServices(String namespace, String resourceName, Long appId, Long softwareId, RequestUser user);
	
	/**
	 * 江苏银行特殊需求：全量升级
	 * 
	 * @author zjm
	 * @date 2017年12月5日
	 *
	 * @param resourceName
	 * @param appId
	 * @param softwareId
	 * @param user
	 * @return
	 */
	public BsmResult upgrade(String namespace, String resourceName, Long appId, Long softwareId, RequestUser user);

}
